//
// Created by LiuYou on 2021/10/12.
//

#include <iostream>
#include <unistd.h>
#include "Counter.hpp"


class ThreadArgs {
public:
    ThreadArgs(MutexLock& mutexLock, Counter& counter) : mutexLock( mutexLock ), counter( counter ) {}

    ~ThreadArgs() = default;

public:
    /**
     * @details 这里使用互斥锁的原因是 在线程 aThread 中使用到了 std::cout,
     * std::cout 不是线程安全的。所以使用它的时候需要加锁保护。
     *
     * <pre>这个互斥锁并不是为了保护 counter, counter本身就是线程安全的。
     */
    MutexLock& mutexLock;
    Counter& counter;
};


static void* aThread(void* args) {
    auto threadArgs = static_cast<Counter*>(args);

//    MutexLockGuard mutexLockGuard( threadArgs->mutexLock );

    Counter aCounter;

    threadArgs->getAndIncrease();


    pthread_exit( nullptr );
}


int main(int argc, char** argv) {
//    Counter aCounter;
//    MutexLock mutexLock;
//    ThreadArgs threadArgs( mutexLock, aCounter );

    auto aCounter = new Counter( 10 );


    pthread_t tid[2];


    // todo 笔记: 这样也是可以的。
    for (auto& item: tid) {
        pthread_create( &item, nullptr, aThread, aCounter );
    }

    sleep( 1 );

    for (pthread_t i: tid) {
        pthread_join( i, nullptr );
    }

    std::cout << *aCounter << std::endl;

    delete aCounter;


    return 0;
}
